﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Refl.Numerics
{
    public class Natural
    {
        internal List<byte> _alg = new List<byte>();

        public Natural(System.Int64 i)
        {
            i = Math.Abs(i);
            if (i <= 0x000000FF)
            {
                _alg.Add((byte)(i & 0x000000FF));
            }
            else if (i <= 0x0000FF00)
            {
                _alg.Add((byte)(i & 0x000000FF));
                _alg.Add((byte)((i & 0x0000FF00) >> 8));
            }
            else if (i <= 0x00FF0000)
            {
                _alg.Add((byte)(i & 0x000000FF));
                _alg.Add((byte)((i & 0x0000FF00) >> 8));
                _alg.Add((byte)((i & 0x00FF0000) >> 16));
            }
            else if (i <= 0xFF000000)
            {
                _alg.Add((byte)(i & 0x000000FF));
                _alg.Add((byte)((i & 0x0000FF00) >> 8));
                _alg.Add((byte)((i & 0x00FF0000) >> 16));
                _alg.Add((byte)((i & 0xFF000000) >> 24));
            }
            else if (i <= 0xFF00000000)
            {
                _alg.Add((byte)(i & 0x000000FF));
                _alg.Add((byte)((i & 0x0000FF00) >> 8));
                _alg.Add((byte)((i & 0x00FF0000) >> 16));
                _alg.Add((byte)((i & 0xFF000000) >> 24));
                _alg.Add((byte)((i & 0xFF00000000) >> 32));
            }
            else if (i <= 0xFF0000000000)
            {
                _alg.Add((byte)(i & 0x000000FF));
                _alg.Add((byte)((i & 0x0000FF00) >> 8));
                _alg.Add((byte)((i & 0x00FF0000) >> 16));
                _alg.Add((byte)((i & 0xFF000000) >> 24));
                _alg.Add((byte)((i & 0xFF00000000) >> 32));
                _alg.Add((byte)((i & 0xFF0000000000) >> 40));
            }
            else if (i <= 0xFF000000000000)
            {
                _alg.Add((byte)(i & 0x000000FF));
                _alg.Add((byte)((i & 0x0000FF00) >> 8));
                _alg.Add((byte)((i & 0x00FF0000) >> 16));
                _alg.Add((byte)((i & 0xFF000000) >> 24));
                _alg.Add((byte)((i & 0xFF00000000) >> 32));
                _alg.Add((byte)((i & 0xFF0000000000) >> 40));
                _alg.Add((byte)((i & 0xFF000000000000) >> 48));
            }
            else
            {
                _alg.Add((byte)(i & 0x000000FF));
                _alg.Add((byte)((i & 0x0000FF00) >> 8));
                _alg.Add((byte)((i & 0x00FF0000) >> 16));
                _alg.Add((byte)((i & 0xFF000000) >> 24));
                _alg.Add((byte)((i & 0xFF00000000) >> 32));
                _alg.Add((byte)((i & 0xFF0000000000) >> 40));
                _alg.Add((byte)((i & 0xFF000000000000) >> 48));
                _alg.Add((byte)(((ulong)(i) & 0xFF00000000000000) >> 56));
            }
        }
    }
}
